//
//  CZDetaiStatuslViewController.swift
//  GZWeibo666
//
//  Created by ksl on 15/12/2.
//  Copyright © 2015年 itcast. All rights reserved.
//

import UIKit
import SVPullToRefresh
import SVProgressHUD

// 管理 cell重用标示
enum CZDetailStatusIdentifier: String {
    case DetailStatusNormalCell = "DetailStatusNormalCell"
    case DetailStatusForwardCell = "DetailStatusForwardCell"
    case DetailCommentCell = "DetailCommentCell"
    case DetailLoadingCell = "DetailLoadingCell"
    case DetailNoDataCell = "DetailNoDataCell"
    
    
    //判断返回对应的 cellId
    static func cellId(obj: AnyObject) -> String {
        if obj is CZStatus {
            return (obj as! CZStatus).retweeted_status == nil ? DetailStatusNormalCell.rawValue : DetailStatusForwardCell.rawValue
        } else if obj is CZDetailCommentModel {
            return (obj as! CZDetailCommentModel).loading ? DetailLoadingCell.rawValue : DetailCommentCell.rawValue
        }
        return DetailStatusNormalCell.rawValue
    }
}



class CZDetaiStatuslViewController: UIViewController {
    
    //MARK: - 属性
    ///微博模型
    private var status: CZStatus
    
    ///评论模型
    private var comments: [CZDetailCommentModel] = [CZDetailCommentModel]()
    
    //构造函数
    init(status: CZStatus) {
        self.status = status
        super.init(nibName: nil, bundle: nil)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        title = "微博详情"
        
        //准备 UI
        preparaUI()
        //准备TableView
        preparaTableView()
    }
    
    deinit {
        print("详情控制器销毁")
    }
    
    //MARK: 准备 UI
    ///准备 UI
    private func preparaUI() {
        
        //添加控件
        view.addSubview(tableView)
        view.addSubview(bottomView)
        //为底部 view 赋值,和其构造函数里赋值相同,但老师不在此赋值
//        bottomView.status = status
        
        //添加约束
        tableView.translatesAutoresizingMaskIntoConstraints = false
        bottomView.translatesAutoresizingMaskIntoConstraints = false
        
        //tableView 水平
        view.addConstraints( NSLayoutConstraint.constraintsWithVisualFormat("H:|[tableView]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["tableView": tableView]))
        
        //bottomView 水平
        view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[bottomView]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["bottomView": bottomView]))
        
        //垂直
        view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-0-[tableView]-0-[bottomView(44)]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["tableView": tableView, "bottomView": bottomView]))
        
    }
    
    ///设置tableView
    private func preparaTableView() {
        
        //设置背景颜色
        tableView.backgroundColor = UIColor(white: 0.9, alpha: 1)
        
        //设置行高
        tableView.estimatedRowHeight = 300
        
        //注册 cell
        tableView.registerClass(CZStatusNormalCell.self, forCellReuseIdentifier: CZDetailStatusIdentifier.DetailStatusNormalCell.rawValue)
        
        tableView.registerClass(CZStatusForwardCell.self, forCellReuseIdentifier: CZDetailStatusIdentifier.DetailStatusForwardCell.rawValue)
        
        tableView.registerClass(CZDetailCommentCell.self, forCellReuseIdentifier: CZDetailStatusIdentifier.DetailCommentCell.rawValue)
        
        tableView.registerClass(CZDetailLoadingCell.self, forCellReuseIdentifier:CZDetailStatusIdentifier.DetailLoadingCell.rawValue)
        
        tableView.registerClass(CZDetailNoDataCell.self, forCellReuseIdentifier: CZDetailStatusIdentifier.DetailNoDataCell.rawValue)
        
        //设置数据源和代理
        tableView.dataSource = self
        tableView.delegate = self
        
        //添加上拉加载更多评论
        tableView.addInfiniteScrollingWithActionHandler { () -> Void in
            print("加载更多评论")
            self.loadMoreComment()
        }
        
        tableView.tableFooterView = UIView()
    }
    
    //MARK: - 懒加载 tableView
    ///懒加载 tableView
    private lazy var tableView = UITableView(frame: CGRectZero, style: UITableViewStyle.Plain)
    
    // 懒加载headerView
    private lazy var headerView: CZDetailHeaderView = {
        let view = CZDetailHeaderView()
        view.delegate = self
//        view.status = self.status
        
        return view
    }()
    
    ///懒加载底部 bottom
    private lazy var bottomView: CZStatusBottomView =  {
        let view = CZStatusBottomView()

        view.delegate = self
        //老师代码里没有进行赋值,所以在详情里,底部 view 是没有显示数字的
        view.status = self.status
        
       return view
    }()
}


//MARK: 扩展实现多个代理
extension CZDetaiStatuslViewController: CZDetailHeaderViewDelegate, CZStatusBottomViewDelegate, CZStatusCellDelegate {
    
    //MARK: - tableView 头部代理
    ///加载评论
    func detailHeaderViewClick(headerView: UIView) {
        //加载最新评论
        print("加载评论")
        loadNewComment()
    }
    
    
    ///加载更多评论
    private func loadNewComment() {
        let since_id = comments.first?.id ?? 0
        
        //添加正在加载数据的 cell
        let loadCommentModel = CZDetailCommentModel(loading: true)
        comments.insert(loadCommentModel, atIndex: 0)
        
        //重新刷新数据
        tableView.reloadData()
        
        //滚动到第 1 组第 0 个 cell
        tableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 1), atScrollPosition: UITableViewScrollPosition.Top, animated: true)
        
        CZDetailCommentModel.loadComment(status.id, since_id: since_id, max_id: 0) { (comments, total_number, previous_cursor, next_cursor, error) -> () in
            
            //移除正在加载数据的 cell
            self.comments.removeFirst()
            
            if error != nil {
                print("加载最新评论失败: \(error)")
                SVProgressHUD.showErrorWithStatus("加载最新评论失败")
                //重新刷新数据
                self.tableView.reloadData()
                return
            }
            
            print("加载最新数据成功: \(comments?.count), next_cursor: \(next_cursor)")
            self.status.comments_count = total_number!
            
            SVProgressHUD.showInfoWithStatus("加载 \(comments?.count ?? 0) 条最新评论")
            
            //判断是否加载到数据
            if comments != nil && comments?.count > 0 {
                
                //把新的数据拼接到现在数据的前面
                self.comments = comments! + self.comments
            }
            //重新刷新数据
            self.tableView.reloadData()
        }     
    }
    
    //MARK: - 加载更多评论
    ///加载更多评论
    private func loadMoreComment() {
        CZDetailCommentModel.loadComment(status.id, since_id: 0, max_id: comments.last?.id ?? 0) { (comments, total_number, previous_cursor, next_cursor, error) -> () in
            //停止上拉加载更多数据动画
            self.tableView.infiniteScrollingView.stopAnimating()
            
            if error != nil {
                 SVProgressHUD.showErrorWithStatus("加载更多评论失败")
                print("加载更多评论失败: \(error)")
                return
            }
            
            print("加载更多评论成功:\(comments?.count), next_cursor: \(next_cursor)")
            
            self.status.comments_count = total_number!
            
            SVProgressHUD.showInfoWithStatus("加载 \(comments?.count ?? 0) 条评论")
            
            self.tableView.showsInfiniteScrolling = next_cursor != 0
            
            //判断是否加载到数据
            if comments != nil && comments?.count > 0 {
                
                //把新获取到的数据拼接在现有数据的后面
                self.comments = self.comments + comments!
                
                //重新刷新数据
                self.tableView.reloadData()
            }
        }
    }
    
    //MARK: - 底部视图代理
    ///转发按钮点击,弹出转发界面
    func forwordButtonClick() {
        let forwardVC = CZComposeViewController(controllerType: CZComposeViewControllerType.Repost)
        
        forwardVC.status = status
        
        presentViewController(UINavigationController(rootViewController: forwardVC), animated: true, completion: nil)
    }
    
    ///评论按钮点击,弱出评论界面
    func commentButtonClick() {
        
        let commentVC = CZComposeViewController(controllerType: CZComposeViewControllerType.Comment)
        
        commentVC.status = status
        
        presentViewController(UINavigationController(rootViewController: commentVC), animated: true, completion: nil)
    }
    
    ///赞按钮点击,
    func likeButtonClick() {
        SVProgressHUD.showInfoWithStatus("没有开放该接口")
    }
    
    //MARK: - cell 代理
    ///点击链接
    func urlClick(text: String) {
        
    }
    
    ///点击被转发的微博,再弹出一个控制器显示被转发的微博详情
    func retweetedStatusClick(clickStatus: CZStatus) {
        let detailVC = CZDetaiStatuslViewController(status: clickStatus)
        detailVC.hidesBottomBarWhenPushed = true
        
        navigationController?.pushViewController(detailVC, animated: true)
    }
}

//MARK: - 扩展CZDetaiStatuslViewController 实现 UITableViewDataSource 和 UITableViewDelegate协议
extension CZDetaiStatuslViewController: UITableViewDataSource, UITableViewDelegate {
    
    ///tableView 显示多少组数据
    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        //显示 2 组
        return 2
    }
    
    ///每组显示多少行
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if section == 0 {//第0组显示一行,微博内容
            return 1
        } else {//第 1 组显示评论cell
           //没有评论数据时返回 没有评论 cell,数量为 1
            if comments.count == 0 {
                return 1
            } else {
                //返回评论数量
                return comments.count
            }
        }
    }
    
    ///每个 cell 的高度
    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        
        //第 0 组显示微博内容,返回微博内容的高度
        if indexPath.section == 0 {
            //根据微博模型获取 cell 的重用标示
            let cellId = CZDetailStatusIdentifier.cellId(status)
            //根据重用标示获得对应的 cell
            let cell = tableView.dequeueReusableCellWithIdentifier(cellId) as! CZStatusCell
            //根据模型计算微博 cell 的高度
            let rowHeight = cell.rowHeight(status)
            
            return rowHeight
        }else {
            //其他组显示微博评论,根据自动约束计算 cell 的高度
            return UITableViewAutomaticDimension
        }
    }
    
    
    //每个 cell 显示什么数据
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        //第 0 组显示微博内容
        if indexPath.section == 0 {
            //根据微博模型获取 cell 的重用标示
            let cellId = CZDetailStatusIdentifier.cellId(status)
            
            //根据 cell 的重用标示获取对应的 cell
            let cell = tableView.dequeueReusableCellWithIdentifier(cellId) as! CZStatusCell
            
            //设置代理
            cell.cellDelegate = self
            
            //给 cell设置模型,cell 根据微博模型显示微博内容
            cell.status = status
            
            return cell
        } else {//其他组显示评论
            //如果没有数据显示,"还没有人评论"
            if comments.count == 0 {
                //根据重用标示获取对应的 cell
                let cell = tableView.dequeueReusableCellWithIdentifier(CZDetailStatusIdentifier.DetailNoDataCell.rawValue) as! CZDetailNoDataCell
                
                //设置没有数据时的消息提示
                cell.message = "还没有人评论"
                
                return cell
            } else { //有评论数据,显示评论数据
                
                //获取评论模型
                let commentModel = comments[indexPath.row]
                
                //根据评论模型获取 cell 的重用标示
                let cellId = CZDetailStatusIdentifier.cellId(commentModel)
                
                //根据重用标示获取对应的 cell
                let cell = tableView.dequeueReusableCellWithIdentifier(cellId) as! CZDetailCommentCell
                
                //给 cell 设置评论模型,cell 根据评论模型显示评论内容
                cell.model = commentModel
                
                return cell
            }
        }
    }
    
    /// 告诉 tableView Header 长什么样
    func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        if section == 1 {
            return headerView
        }  else { //其他组脚部控件高度 0
            return nil
        }
    }
    
    
    ///tableView每组头部高度
    func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        if section == 1 {
            return 44
        } else { //其他组脚部控件高度 0
            return 0
        }
    }

    ///tableView每组脚部高度
    func tableView(tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
        if section == 0 {
            return 10
        } else { //其他组脚部控件高度 0
            return 0
        }
    }
    
    ///tableView 是否要高亮
    func tableView(tableView: UITableView, shouldHighlightRowAtIndexPath indexPath: NSIndexPath) -> Bool {
        if indexPath.section == 0 {
            //第 0 组是微博 cell ,点击的时候不需要高亮
            return false
        } else {
            //其他组显示评论内容,点击 cell需要高亮
            return true
        }
    }
}
